package com.rustic.server.service;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.rustic.server.enums.LinkType;
import com.rustic.server.po.UserLikeLink;
import com.rustic.server.query.UserLikeLinkAdminListQuery;
import com.rustic.server.query.UserLikeLinkUserListQuery;
import com.rustic.server.vo.list.UserLikeLinkAdminListVO;
import com.rustic.server.vo.list.UserLikeLinkWebListVO;

import java.util.List;
import java.util.Map;

/**
 * 表[user_like_link]对应的服务类
 *
 * @author auto
 */

public interface UserLikeLinkService extends IService<UserLikeLink> {

    String USER_LIKE_LINK_NOT_EXIST = "用户点赞关联不存在";

    String USER_LIKE_LINK_EXIST = "已点赞";

    /**
     * 查询（根据ID 批量查询）
     *
     * @param idList id列表
     * @return 用户点赞关联列表
     */
    List<UserLikeLink> listByIdIn(List<Integer> idList);

    /**
     * 查询（根据ID 批量查询）并转换成Map
     *
     * @param idList id列表
     * @return 用户点赞关联列表
     */
    Map<Integer, UserLikeLink> mapByIdIn(List<Integer> idList);

    /**
     * 管理列表查询条件
     *
     * @param query 查询参数
     * @return 查询条件
     */
    LambdaQueryWrapper<UserLikeLink> toAdminListWrapper(UserLikeLinkAdminListQuery query);

    /**
     * toAdminListVo
     *
     * @param userLikeLinkList userLikeLinkList
     * @return AdminListVO
     */
    List<UserLikeLinkAdminListVO> toAdminListVo(List<UserLikeLink> userLikeLinkList);

    /**
     * toWebListVo
     *
     * @param userLikeLinkList userLikeLinkList
     * @return WebListVo
     */
    List<UserLikeLinkWebListVO> toWebListVo(List<UserLikeLink> userLikeLinkList);

    /**
     * 用户查询点赞记录
     *
     * @param query  查询参数
     * @param userId 用户id
     * @return 查询条件
     */
    LambdaQueryWrapper<UserLikeLink> toWebListWrapper(UserLikeLinkUserListQuery query, int userId);

    /**
     * 根据目标id列表和目标类型进行查询，并统计对应目标的点赞数据数量
     *
     * @param targetIdList 目标id列表
     * @param type         目标类型
     * @return Map<Integer, Long> 统计对应目标的数据数量
     */
    Map<Integer, Long> mapByTargetIdAndType(List<Integer> targetIdList, LinkType type);

    /**
     * 根据目标id和目标类型查询点赞数量
     *
     * @param targetId 目标id
     * @param type     类型
     * @return 点赞数量
     */
    Long getTargetAndType(int targetId, LinkType type);

    /**
     * 根据目标id列表、用户id和类型查询点赞，并转化map
     *
     * @param targetIdList 目标id列表
     * @param type         目标类型
     * @param userId       用户id
     * @return Map<Integer, UserLikeLink> key:目标id,value:UserLikeLink
     */
    Map<Integer, UserLikeLink> mapByUserTargetAndType(List<Integer> targetIdList, LinkType type, int userId);

    /**
     * 根据用户id、目标id和类型查询用户是否有点赞
     *
     * @param userId   用户id
     * @param targetId 目标id
     * @param type     对应类型
     * @return UserLikeLink
     */
    UserLikeLink getByUserTargetAndType(int userId, int targetId, int type);

    /**
     * 用户点赞
     *
     * @param userId   用户id
     * @param targetId 目标id
     * @param type     类型
     * @return String
     */
    String addOrDelLike(int userId, int targetId, int type);
}
